#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
PostgreSQL 数据库快速设置脚本

此脚本帮助用户快速配置PostgreSQL数据库连接和初始化数据库表。

使用方法:
    python setup_postgresql.py

作者: AI Assistant
创建时间: 2024
"""

import os
import sys
import getpass
from pathlib import Path

# 添加项目根目录到Python路径
project_root = Path(__file__).parent.parent.parent
sys.path.insert(0, str(project_root))

try:
    import psycopg2
except ImportError:
    print("错误: 未安装 psycopg2-binary")
    print("请运行: pip install psycopg2-binary")
    sys.exit(1)

from .config import DatabaseConfig
from .database import init_database, create_tables


def test_connection(config):
    """
    测试数据库连接
    
    Args:
        config (dict): 数据库配置字典
        
    Returns:
        bool: 连接是否成功
    """
    try:
        db_config = DatabaseConfig(config)
        url = db_config.get_database_url()
        
        # 解析URL进行连接测试
        import re
        pattern = r'postgresql://([^:]+):([^@]+)@([^:]+):(\d+)/(.+)'
        match = re.match(pattern, url)
        
        if not match:
            print("错误: 无效的数据库URL格式")
            return False
            
        username, password, host, port, database = match.groups()
        
        # 测试连接
        conn = psycopg2.connect(
            host=host,
            port=int(port),
            database=database,
            user=username,
            password=password
        )
        conn.close()
        print("✓ 数据库连接测试成功")
        return True
        
    except psycopg2.OperationalError as e:
        print(f"✗ 数据库连接失败: {e}")
        return False
    except Exception as e:
        print(f"✗ 连接测试出错: {e}")
        return False


def create_env_file(config):
    """
    创建环境变量配置文件
    
    Args:
        config (dict): 数据库配置字典
    """
    env_path = project_root / '.env'
    
    # 检查是否已存在 .env 文件
    if env_path.exists():
        response = input(f"环境变量配置文件已存在，是否覆盖? (y/N): ")
        if response.lower() != 'y':
            print("跳过创建环境变量配置文件")
            return
    
    env_content = f"""# 微信机器人数据库配置
# 由 setup_postgresql.py 自动生成

# 数据库配置
DB_TYPE=postgresql
DB_HOST={config['host']}
DB_PORT={config['port']}
DB_NAME={config['database']}
DB_USER={config['username']}
DB_PASSWORD={config['password']}
DB_SSLMODE=prefer
DB_TIMEOUT=10
DB_APP_NAME=wechat_robot

# Flask 配置
FLASK_ENV=development
FLASK_DEBUG=true
FLASK_PORT=5000
FLASK_HOST=0.0.0.0
SECRET_KEY=your-secret-key-change-in-production

# 微信配置
WECHAT_AUTO_REPLY_ENABLED=true
WECHAT_DEFAULT_REPLY_MESSAGE=收到！
WECHAT_WELCOME_ENABLED=false
WECHAT_WELCOME_TEMPLATE=欢迎 @{{member_name}} 加入群聊！🎉

# 日志配置
LOG_LEVEL=INFO
LOG_FILE_PATH=logs/wechat_robot.log
"""
    
    try:
        with open(env_path, 'w', encoding='utf-8') as f:
            f.write(env_content)
        print(f"✓ 已创建环境变量配置文件: {env_path}")
    except Exception as e:
        print(f"✗ 创建环境变量配置文件失败: {e}")


def get_database_config():
    """
    获取用户输入的数据库配置
    
    Returns:
        dict: 数据库配置字典
    """
    print("=" * 50)
    print("PostgreSQL 数据库配置")
    print("=" * 50)
    
    config = {}
    
    # 获取数据库主机
    config['host'] = input("数据库主机 [localhost]: ").strip() or 'localhost'
    
    # 获取数据库端口
    port_input = input("数据库端口 [5432]: ").strip() or '5432'
    try:
        config['port'] = int(port_input)
    except ValueError:
        print("警告: 端口号无效，使用默认值 5432")
        config['port'] = 5432
    
    # 获取数据库名称
    config['database'] = input("数据库名称 [wechat_robot]: ").strip() or 'wechat_robot'
    
    # 获取用户名
    config['username'] = input("数据库用户名 [postgres]: ").strip() or 'postgres'
    
    # 获取密码
    config['password'] = getpass.getpass("数据库密码: ")
    
    # 设置其他默认配置
    config['type'] = 'postgresql'
    config['sslmode'] = 'prefer'
    config['timeout'] = 10
    config['application_name'] = 'wechat_robot'
    
    return config


def main():
    """
    主函数
    """
    print("PostgreSQL 数据库快速设置工具")
    print("=" * 50)
    
    # 检查是否已安装 psycopg2
    try:
        import psycopg2
        print("✓ psycopg2-binary 已安装")
    except ImportError:
        print("✗ 未安装 psycopg2-binary")
        print("请运行: pip install psycopg2-binary")
        return
    
    # 获取数据库配置
    config = get_database_config()
    
    print("\n" + "=" * 50)
    print("配置信息确认")
    print("=" * 50)
    print(f"主机: {config['host']}")
    print(f"端口: {config['port']}")
    print(f"数据库: {config['database']}")
    print(f"用户名: {config['username']}")
    print(f"密码: {'*' * len(config['password'])}")
    
    confirm = input("\n确认配置信息? (Y/n): ").strip()
    if confirm.lower() == 'n':
        print("已取消设置")
        return
    
    # 测试数据库连接
    print("\n" + "=" * 50)
    print("测试数据库连接")
    print("=" * 50)
    
    if not test_connection(config):
        print("\n数据库连接失败，请检查配置信息")
        print("常见问题:")
        print("1. PostgreSQL 服务是否启动")
        print("2. 数据库是否存在")
        print("3. 用户名和密码是否正确")
        print("4. 防火墙是否阻止连接")
        return
    
    # 创建环境变量配置文件
    print("\n" + "=" * 50)
    print("创建配置文件")
    print("=" * 50)
    create_env_file(config)
    
    # 询问是否初始化数据库表
    print("\n" + "=" * 50)
    print("数据库初始化")
    print("=" * 50)
    
    init_tables = input("是否初始化数据库表? (Y/n): ").strip()
    if init_tables.lower() != 'n':
        try:
            # 这里需要创建一个临时的Flask应用来初始化数据库
            from flask import Flask
            
            app = Flask(__name__)
            with app.app_context():
                init_database(app, config_dict=config)
                create_tables(app)
                print("✓ 数据库表初始化成功")
                
        except Exception as e:
            print(f"✗ 数据库表初始化失败: {e}")
            print("您可以稍后手动运行: python db_manager.py init")
    
    print("\n" + "=" * 50)
    print("设置完成")
    print("=" * 50)
    print("下一步:")
    print("1. 检查环境变量配置")
    print("2. 运行应用: python api_restructured.py")
    print("3. 如需管理数据库，使用: python utils/database/db_manager.py")


if __name__ == '__main__':
    main()